package com.mall.entity

import jakarta.persistence.*
import org.hibernate.annotations.SQLDelete
import org.hibernate.annotations.Where
import java.math.BigDecimal
import java.time.LocalDateTime

/**
 * 商品实体类
 * 
 * 该实体类使用JPA注解映射到数据库表，主要功能：
 * 1. 实现商品信息的数据存储
 * 2. 使用软删除机制（不直接从数据库删除记录）
 * 3. 支持商品库存和价格的精确管理
 * 4. 记录数据的创建、更新和删除时间
 * 
 * @Entity JPA实体类注解
 * @Table 指定数据库表名为products
 * @SQLDelete 自定义删除SQL，实现软删除
 * @Where 查询时自动过滤已删除的记录
 */
@Entity
@Table(name = "products")
@SQLDelete(sql = "UPDATE products SET deleted_at = now() WHERE id = ?")
@Where(clause = "deleted_at IS NULL")
data class Product(
    /**
     * 商品ID
     * 
     * @Id 标识主键
     * @GeneratedValue 使用数据库自增策略生成ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null,
    
    /**
     * 商品名称
     * 
     * @Column 设置字段属性：
     * - nullable = false 不允许为空
     * - length = 100 字段长度限制
     */
    @Column(nullable = false, length = 100)
    var name: String = "",
    
    /**
     * 商品描述
     * 
     * 使用TEXT类型存储长文本内容
     * 可选字段，允许为null
     */
    @Column(columnDefinition = "TEXT")
    var description: String? = null,
    
    /**
     * 商品价格
     * 
     * 使用BigDecimal保证精确计算
     * precision = 10 表示总位数
     * scale = 2 表示小数位数
     */
    @Column(nullable = false, precision = 10, scale = 2)
    var price: BigDecimal = BigDecimal.ZERO,
    
    /**
     * 商品库存
     * 
     * 不允许为空，默认值为0
     * 用于库存管理和库存预警
     */
    @Column(nullable = false)
    var stock: Int = 0,
    
    /**
     * 商品图片
     * 
     * 存储图片的URL或路径
     * 可选字段，允许为null
     */
    @Column(length = 255)
    var image: String? = null,
    
    /**
     * 商品状态
     * 
     * 默认值为"active"，可用于控制商品上下架
     * 常用状态：active（上架）、inactive（下架）
     */
    @Column(length = 20)
    var status: String = "active",
    
    /**
     * 记录创建时间
     * 
     * 由数据库在插入记录时自动设置
     */
    @Column(name = "created_at")
    var createdAt: LocalDateTime? = null,
    
    /**
     * 记录更新时间
     * 
     * 由数据库在更新记录时自动设置
     */
    @Column(name = "updated_at")
    var updatedAt: LocalDateTime? = null,
    
    /**
     * 记录删除时间
     * 
     * 实现软删除机制，而不是物理删除记录
     * 当字段为null时表示记录未删除
     */
    @Column(name = "deleted_at")
    var deletedAt: LocalDateTime? = null
)